React Suspenseããã¹ã¿ãŒããããŒãã£ã³ã°ç¶æ ã®æ§ææ¹æ³ãšãã·ãŒã ã¬ã¹ãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®ããã®ãã¹ããããããŒãã£ã³ã°ã·ããªãªã®ç®¡çæ¹æ³ãçè§£ããŸãããã
React Suspense ããŒãã£ã³ã°ç¶æ ã®æ§æïŒãã¹ããããããŒãã£ã³ã°ç®¡ç
React 16.6 ã§å°å ¥ããã React Suspense ã¯ãã¢ããªã±ãŒã·ã§ã³ã§ããŒãã£ã³ã°ç¶æ ãåŠçããããã®å®£èšçãªæ¹æ³ãæäŸããŸããäŸåé¢ä¿ (ããŒã¿ãã³ãŒããªã©) ã®æºåãã§ãããŸã§ãã³ã³ããŒãã³ãã®ã¬ã³ããªã³ã°ããäžæãã§ããŸããåºæ¬çãªäœ¿ãæ¹ã¯æ¯èŒçç°¡åã§ãããSuspense ããã¹ã¿ãŒããã«ã¯ãç¹ã«ãã¹ããããããŒãã£ã³ã°ã·ããªãªãæ±ãå Žåã«ãããŒãã£ã³ã°ç¶æ ã广çã«æ§æããæ¹æ³ãçè§£ããå¿ èŠããããŸãããã®èšäºã§ã¯ãã¹ã ãŒãºã§é åçãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãå®çŸããããã® React Suspense ãšãã®é«åºŠãªæ§ææè¡ã«ã€ããŠãå æ¬çãªã¬ã€ããæäŸããŸãã
React Suspense ã®åºæ¬ãçè§£ãã
Suspense ã¯ãæ¬è³ªçã« fallback prop ãåãå
¥ãã React ã³ã³ããŒãã³ãã§ãããã®ãã©ãŒã«ããã¯ã¯ãSuspense ã§ã©ãããããã³ã³ããŒãã³ããäœããããŒãããã®ãåŸ
æ©ããŠããéã«ã¬ã³ããªã³ã°ãããŸããæãäžè¬çãªäœ¿çšäŸã«ã¯ã次ã®ãã®ãå«ãŸããŸãã
React.lazyã䜿çšããã³ãŒãåå²ïŒ åæãã³ãã«ãµã€ãºãåæžããããã«ãã³ã³ããŒãã³ããåçã«ã€ã³ããŒãããŸãã- ããŒã¿ãã§ããã³ã°ïŒ ã³ã³ããŒãã³ããäŸåããã³ã³ããŒãã³ããã¬ã³ããªã³ã°ããåã«ãAPI ããã®ããŒã¿ã解決ãããã®ãåŸ ã¡ãŸãã
React.lazy ã䜿çšããã³ãŒãåå²
React.lazy ã䜿çšãããšãReact ã³ã³ããŒãã³ãããªã³ããã³ãã§ããŒãã§ããŸããããã¯ãå€ãã®ã³ã³ããŒãã³ããæã€å€§èŠæš¡ãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ç¹ã«ãã¢ããªã±ãŒã·ã§ã³ã®åæããŒãæéã倧å¹
ã«æ¹åã§ããŸããåºæ¬çãªäŸã次ã«ç€ºããŸãã
import React, { Suspense, lazy } from 'react';
const MyComponent = lazy(() => import('./MyComponent'));
function App() {
return (
<Suspense fallback={<p>Loading...</p>}>
<MyComponent />
</Suspense>
);
}
export default App;
ãã®äŸã§ã¯ãMyComponent ã¯å¿
èŠã«ãªã£ããšãã«ã®ã¿ããŒããããŸããããŒãäžã¯ãfallback (ãã®å Žåã¯åçŽãªãLoading...ãã¡ãã»ãŒãž) ã衚瀺ãããŸãã
Suspense ã䜿çšããããŒã¿ãã§ããã³ã°
React.lazy 㯠Suspense ãšããã«é£æºããŠåäœããŸãããããŒã¿ãã§ããã³ã°ã«ã¯å°ãç°ãªãã¢ãããŒããå¿
èŠã§ããSuspense ã¯ãfetch ã axios ãªã©ã®æšæºçãªããŒã¿ãã§ããã³ã°ã©ã€ãã©ãªãšçŽæ¥çµ±åãããŠããŸããã代ããã«ãããŒã¿ã®èªã¿èŸŒã¿ãåŸ
æ©äžã«ã³ã³ããŒãã³ãããäžæãã§ããã©ã€ãã©ãªãŸãã¯ãã¿ãŒã³ã䜿çšããå¿
èŠããããŸããäžè¬çãªè§£æ±ºçãšããŠã¯ãswr ã react-query ãªã©ã®ããŒã¿ãã§ããã³ã°ã©ã€ãã©ãªã䜿çšããããã«ã¹ã¿ã ãªãœãŒã¹ç®¡çæŠç¥ãå®è£
ããããšããããŸãã
ã«ã¹ã¿ã ãªãœãŒã¹ç®¡çã¢ãããŒãã䜿çšããæŠå¿µçãªäŸã次ã«ç€ºããŸãã
// Resource.js
const createResource = (promise) => {
let status = 'pending';
let result;
let suspender = promise.then(
(r) => {
status = 'success';
result = r;
},
(e) => {
status = 'error';
result = e;
}
);
return {
read() {
if (status === 'pending') {
throw suspender;
} else if (status === 'error') {
throw result;
}
return result;
},
};
};
export default createResource;
// MyComponent.js
import React from 'react';
import createResource from './Resource';
const fetchData = () =>
new Promise((resolve) =>
setTimeout(() => resolve({ data: 'Fetched Data!' }), 2000)
);
const resource = createResource(fetchData());
function MyComponent() {
const data = resource.read();
return <p>{data.data}</p>;
}
export default MyComponent;
// App.js
import React, { Suspense } from 'react';
import MyComponent from './MyComponent';
function App() {
return (
<Suspense fallback={<p>Loading data...</p>}>
<MyComponent />
</Suspense>
);
}
export default App;
説æïŒ
createResourceïŒãã®é¢æ°ã¯ Promise ãåãåããreadã¡ãœãããæã€ãªããžã§ã¯ããè¿ããŸããreadïŒãã®ã¡ãœããã¯ãPromise ã®ã¹ããŒã¿ã¹ã確èªããŸããä¿çäžã®å Žåã¯ãPromise ãã¹ããŒããã³ã³ããŒãã³ããäžæããŸãã解決æžã¿ã®å Žåã¯ãããŒã¿ãè¿ããŸããæåŠãããå Žåã¯ããšã©ãŒãã¹ããŒããŸããMyComponentïŒãã®ã³ã³ããŒãã³ãã¯ãresource.read()ã¡ãœããã䜿çšããŠããŒã¿ã«ã¢ã¯ã»ã¹ããŸããããŒã¿ãæºåã§ããŠããªãå Žåãã³ã³ããŒãã³ãã¯äžæããŸããAppïŒMyComponentãSuspenseã§ã©ããããããŒã¿ã®èªã¿èŸŒã¿äžã«ãã©ãŒã«ãã㯠UI ãæäŸããŸãã
ããŒãã£ã³ã°ç¶æ ã®æ§æïŒãã¹ãããã Suspense ã®å
Suspense ã®çã®åã¯ããã®æ§æèœåã«ãããŸãã Suspense ã³ã³ããŒãã³ãããã¹ãããŠããããã现ããæŽç·ŽãããããŒãã£ã³ã°ãšã¯ã¹ããªãšã³ã¹ãäœæã§ããŸããããã¯ãè€æ°ã®éåæäŸåé¢ä¿ãæã€ã³ã³ããŒãã³ããæ±ãå ŽåããUI ã®ç¹å®ã®éšåã®èªã¿èŸŒã¿ãåªå ããããå Žåã«ç¹ã«åœ¹ç«ã¡ãŸãã
åºæ¬çãªãã¹ãããã Suspense
ããããŒãã¡ã€ã³ã³ã³ãã³ãé åããµã€ãããŒãããããŒãžãæ³åããŠã¿ãŸãããããããã®åã³ã³ããŒãã³ãã«ã¯ãç¬èªã®éåæäŸåé¢ä¿ãããå ŽåããããŸãããã¹ãããã Suspense ã³ã³ããŒãã³ãã䜿çšããŠãåã»ã¯ã·ã§ã³ã«åå¥ã®ããŒãã£ã³ã°ç¶æ ã衚瀺ã§ããŸãã
import React, { Suspense, lazy } from 'react';
const Header = lazy(() => import('./Header'));
const MainContent = lazy(() => import('./MainContent'));
const Sidebar = lazy(() => import('./Sidebar'));
function App() {
return (
<div>
<Suspense fallback={<p>Loading header...</p>}>
<Header />
</Suspense>
<div style={{ display: 'flex' }}>
<Suspense fallback={<p>Loading main content...</p>}>
<MainContent />
</Suspense>
<Suspense fallback={<p>Loading sidebar...</p>}>
<Sidebar />
</Suspense>
</div>
</div>
);
}
export default App;
ãã®äŸã§ã¯ãåã³ã³ããŒãã³ã (HeaderãMainContentãããã³ Sidebar) ãç¬èªã® Suspense å¢çã§ã©ãããããŠããŸããããã¯ãHeader ããŸã ããŒãäžã®å ŽåããLoading header...ãã¡ãã»ãŒãžã衚瀺ãããMainContent ãš Sidebar ã¯åå¥ã«ããŒãã§ããããšãæå³ããŸããããã«ãããããå¿çæ§ãé«ããæ
å ±éã®å€ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãå¯èœã«ãªããŸãã
ããŒãã£ã³ã°ç¶æ ã®åªå é äœä»ã
å Žåã«ãã£ãŠã¯ãUI ã®ç¹å®ã®éšåã®èªã¿èŸŒã¿ãåªå ããããå ŽåããããŸããããšãã°ãã¡ã€ã³ã³ã³ãã³ãã®åã«ããããŒãšããã²ãŒã·ã§ã³ãããŒããããããã«ãããå ŽåããããŸããããã¯ãSuspense ã³ã³ããŒãã³ããæŠç¥çã«ãã¹ãããããšã§å®çŸã§ããŸãã
import React, { Suspense, lazy } from 'react';
const Header = lazy(() => import('./Header'));
const MainContent = lazy(() => import('./MainContent'));
function App() {
return (
<Suspense fallback={<p>Loading header and content...</p>}>
<Header />
<Suspense fallback={<p>Loading main content...</p>}>
<MainContent />
</Suspense>
</Suspense>
);
}
export default App;
ãã®äŸã§ã¯ãHeader ãš MainContent ã¯ã©ã¡ããåäžã®å€éš Suspense å¢çã§ã©ãããããŠããŸããããã¯ããLoading header and content...ãã¡ãã»ãŒãžã¯ãHeader ãš MainContent ã®äž¡æ¹ãããŒãããããŸã§è¡šç€ºãããããšãæå³ããŸããMainContent ã®å
éš Suspense ã¯ãHeader ãæ¢ã«ããŒããããŠããå Žåã«ã®ã¿ããªã¬ãŒãããã³ã³ãã³ãé åã§ãããã现ããããŒãã£ã³ã°ãšã¯ã¹ããªãšã³ã¹ãæäŸããŸãã
é«åºŠãªãã¹ããããããŒãã£ã³ã°ç®¡ç
åºæ¬çãªãã¹ããè¶ ããŠãè€éãªã¢ããªã±ãŒã·ã§ã³ã§ããŒãã£ã³ã°ç¶æ ã管çããããã®ããé«åºŠãªãã¯ããã¯ã䜿çšã§ããŸãããããã«ã¯ä»¥äžãå«ãŸããŸãã
- ã«ã¹ã¿ã ãã©ãŒã«ããã¯ã³ã³ããŒãã³ãïŒ ããèŠèŠçã«é åçã§ãæ å ±éã®å€ãããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒã䜿çšããã
- ãšã©ãŒå¢çã«ãããšã©ãŒåŠçïŒ ããŒãã£ã³ã°äžã«çºçãããšã©ãŒãé©åã«åŠçããã
- Debouncing ãš ThrottlingïŒ ã³ã³ããŒãã³ããããŒã¿ãããŒãããããšããåæ°ãæé©åããã
- Suspense ãš Transitions ã®çµã¿åããïŒ ããŒãã£ã³ã°ç¶æ ãšããŒãæžã¿ã®ç¶æ ã®éãã¹ã ãŒãºã«é·ç§»ãããã
ã«ã¹ã¿ã ãã©ãŒã«ããã¯ã³ã³ããŒãã³ã
åçŽãªããã¹ãã¡ãã»ãŒãžããã©ãŒã«ããã¯ãšããŠäœ¿çšãã代ããã«ãããåªãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããã«ã¹ã¿ã ãã©ãŒã«ããã¯ã³ã³ããŒãã³ããäœæã§ããŸãããããã®ã³ã³ããŒãã³ãã«ã¯ä»¥äžãå«ãŸããŸãã
- ã¹ãããŒïŒ ã¢ãã¡ãŒã·ã§ã³åãããããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒã
- ã¹ã±ã«ãã³ïŒ å®éã®ã³ã³ãã³ãã®æ§é ãæš¡å£ãããã¬ãŒã¹ãã«ã㌠UI èŠçŽ ã
- ããã°ã¬ã¹ããŒïŒ ããŒãã£ã³ã°ã®é²æç¶æ³ã瀺ãèŠèŠçãªã€ã³ãžã±ãŒã¿ãŒã
ãã©ãŒã«ããã¯ãšããŠã¹ã±ã«ãã³ã³ã³ããŒãã³ãã䜿çšããäŸã次ã«ç€ºããŸãã
import React from 'react';
import Skeleton from 'react-loading-skeleton'; // You'll need to install this library
function LoadingSkeleton() {
return (
<div>
<Skeleton count={3} />
</div>
);
}
export default LoadingSkeleton;
// Usage in App.js
import React, { Suspense, lazy } from 'react';
import LoadingSkeleton from './LoadingSkeleton';
const MyComponent = lazy(() => import('./MyComponent'));
function App() {
return (
<Suspense fallback={<LoadingSkeleton />}>
<MyComponent />
</Suspense>
);
}
export default App;
ãã®äŸã§ã¯ãreact-loading-skeleton ã©ã€ãã©ãªã䜿çšããŠãMyComponent ãããŒããããŠããéã«äžé£ã®ã¹ã±ã«ãã³ãã¬ãŒã¹ãã«ããŒã衚瀺ããŸãã
ãšã©ãŒå¢çã«ãããšã©ãŒåŠç
ããŒãã£ã³ã°ããã»ã¹äžã«çºçããå¯èœæ§ã®ãããšã©ãŒãåŠçããããšãéèŠã§ããReact ã¯ããã®åã³ã³ããŒãã³ãããªãŒå ã®ã©ãã§ã JavaScript ãšã©ãŒããã£ãããããããã®ãšã©ãŒããã°ã«èšé²ãããã©ãŒã«ãã㯠UI ã衚瀺ããã³ã³ããŒãã³ãã§ãããšã©ãŒå¢çãæäŸããŸãããšã©ãŒå¢ç㯠Suspense ãšé£æºããŠãå ç¢ãªãšã©ãŒåŠçã¡ã«ããºã ãæäŸããŸãã
import React, { Component } from 'react';
class ErrorBoundary extends Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError(error) {
// Update state so the next render will show the fallback UI.
return { hasError: true };
}
componentDidCatch(error, errorInfo) {
// You can also log the error to an error reporting service
console.error(error, errorInfo);
}
render() {
if (this.state.hasError) {
// You can render any custom fallback UI
return <h1>Something went wrong.</h1>;
}
return this.props.children;
}
}
export default ErrorBoundary;
// Usage in App.js
import React, { Suspense, lazy } from 'react';
import ErrorBoundary from './ErrorBoundary';
const MyComponent = lazy(() => import('./MyComponent'));
function App() {
return (
<ErrorBoundary>
<Suspense fallback={<p>Loading...</p>}>
<MyComponent />
</Suspense>
</ErrorBoundary>
);
}
export default App;
ãã®äŸã§ã¯ãErrorBoundary ã³ã³ããŒãã³ãã Suspense ã³ã³ããŒãã³ããã©ããããŠããŸãã MyComponent ã®èªã¿èŸŒã¿äžã«ãšã©ãŒãçºçããå ŽåãErrorBoundary ã¯ãšã©ãŒããã£ãããããSomething went wrong.ãã¡ãã»ãŒãžã衚瀺ããŸãã
Debouncing ãš Throttling
å Žåã«ãã£ãŠã¯ãã³ã³ããŒãã³ããããŒã¿ãããŒãããããšããåæ°ãå¶éãããå ŽåããããŸããããã¯ãããŒã¿ãã§ããã³ã°ããã»ã¹ãé«ã³ã¹ãã§ããå Žåããéå°ãª API åŒã³åºããé²ãããå Žåã«åœ¹ç«ã¡ãŸãã Debouncing ãš throttling ã¯ããããå®çŸããã®ã«åœ¹ç«ã€ 2 ã€ã®ãã¯ããã¯ã§ãã
DebouncingïŒ é¢æ°ãæåŸã«åŒã³åºãããŠããäžå®ã®æéãçµéãããŸã§ã颿°ã®å®è¡ãé ãããŸãã
ThrottlingïŒ é¢æ°ã®å®è¡é床ãå¶éããŸãã
ãããã®ãã¯ããã¯ã¯ãå€ãã®å ŽåããŠãŒã¶ãŒå ¥åã€ãã³ãã«é©çšãããŸãããSuspense å¢çå ã§ããŒã¿ãã§ããã³ã°ãå¶åŸ¡ããããã«ã䜿çšã§ããŸããå®è£ ã¯ã䜿çšããŠããç¹å®ã®ããŒã¿ãã§ããã³ã°ã©ã€ãã©ãªãŸãã¯ãªãœãŒã¹ç®¡çæŠç¥ã«ãã£ãŠç°ãªããŸãã
Suspense ãš Transitions ã®çµã¿åãã
React Transitions API (React 18 ã§å°å
¥) ã䜿çšãããšãããŒãã£ã³ã°ç¶æ
ãããŒãæžã¿ã®ç¶æ
ãªã©ãã¢ããªã±ãŒã·ã§ã³å
ã®ããŸããŸãªç¶æ
éã®ããã¹ã ãŒãºãªãã©ã³ãžã·ã§ã³ãäœæã§ããŸãã useTransition ã䜿çšããŠãç¶æ
æŽæ°ããã©ã³ãžã·ã§ã³ã§ããããšã React ã«éç¥ãããšãã®ã¯ã·ã£ã¯ãã UI æŽæ°ãé²ãã®ã«åœ¹ç«ã¡ãŸãã
import React, { Suspense, lazy, useState, useTransition } from 'react';
const MyComponent = lazy(() => import('./MyComponent'));
function App() {
const [isPending, startTransition] = useTransition();
const [showComponent, setShowComponent] = useState(false);
const handleClick = () => {
startTransition(() => {
setShowComponent(true);
});
};
return (
<div>
<button onClick={handleClick} disabled={isPending}>
{isPending ? 'Loading...' : 'Load Component'}
</button>
{showComponent && (
<Suspense fallback={<p>Loading component...</p>}>
<MyComponent />
</Suspense>
)}
</div>
);
}
export default App;
ãã®äŸã§ã¯ããLoad Componentããã¿ã³ãã¯ãªãã¯ãããšããã©ã³ãžã·ã§ã³ãããªã¬ãŒãããŸãã React ã¯ãUI ã®å¿çæ§ãç¶æããªãããMyComponent ã®èªã¿èŸŒã¿ãåªå
ããŸãã isPending ç¶æ
ã¯ããã©ã³ãžã·ã§ã³ãé²è¡äžãã©ããã瀺ãããã¿ã³ãç¡å¹ã«ããŠããŠãŒã¶ãŒã«èŠèŠçãªãã£ãŒãããã¯ãæäŸã§ããŸãã
å®éã®äŸãšã·ããªãª
ãã¹ãããã Suspense ã®å®éçãªã¢ããªã±ãŒã·ã§ã³ãããã«èª¬æããããã«ãããã€ãã®çŸå®ã®ã·ããªãªãæ€èšããŠã¿ãŸãããã
- e ã³ããŒã¹è£œåããŒãžïŒ 補åããŒãžã«ã¯ã補åã®è©³çްãã¬ãã¥ãŒãé¢é£è£œåãªã©ãè€æ°ã®ã»ã¯ã·ã§ã³ãããå ŽåããããŸããåã»ã¯ã·ã§ã³ã¯ããã¹ãããã Suspense å¢çã䜿çšããŠåå¥ã«ããŒãã§ããŸãã補åã®è©³çްã®èªã¿èŸŒã¿ãåªå ããŠããŠãŒã¶ãŒãæãéèŠãªæ å ±ãã§ããã ãæ©ã確èªã§ããããã«ããããšãã§ããŸãã
- ãœãŒã·ã£ã«ã¡ãã£ã¢ãã£ãŒãïŒ ãœãŒã·ã£ã«ã¡ãã£ã¢ãã£ãŒãã¯ãæçš¿ãã³ã¡ã³ãããŠãŒã¶ãŒãããã¡ã€ã«ã§æ§æãããå ŽåããããŸãããããã®åã³ã³ããŒãã³ãã«ã¯ãç¬èªã®éåæäŸåé¢ä¿ãããå ŽåããããŸãããã¹ãããã Suspense ã䜿çšãããšãããŒã¿ãããŒããããŠããéã«ãåã»ã¯ã·ã§ã³ã®ãã¬ãŒã¹ãã«ã㌠UI ã衚瀺ã§ããŸãããŸãããŠãŒã¶ãŒèªèº«ã®æçš¿ã®èªã¿èŸŒã¿ãåªå ããŠãããŒãœãã©ã€ãºããããšã¯ã¹ããªãšã³ã¹ãæäŸããããšãã§ããŸãã
- ããã·ã¥ããŒãã¢ããªã±ãŒã·ã§ã³ïŒ ããã·ã¥ããŒãã«ã¯ãããŸããŸãªãœãŒã¹ããã®ããŒã¿ã衚瀺ããè€æ°ã®ãŠã£ãžã§ãããå«ãŸããå ŽåããããŸãããã¹ãããã Suspense ã䜿çšããŠãåãŠã£ãžã§ãããåå¥ã«ããŒãã§ããŸããããã«ããããŠãŒã¶ãŒã¯ä»ã®ãŠã£ãžã§ããããŸã ããŒããããŠããéã«ãå©çšå¯èœãªãŠã£ãžã§ããã確èªã§ããããå¿çæ§ãé«ããã€ã³ã¿ã©ã¯ãã£ããªãšã¯ã¹ããªãšã³ã¹ãå®çŸããŸãã
äŸïŒe ã³ããŒã¹è£œåããŒãž
e ã³ããŒã¹è£œåããŒãžã§ãã¹ãããã Suspense ãå®è£ ããæ¹æ³ãåè§£ããŠã¿ãŸãããã
import React, { Suspense, lazy } from 'react';
const ProductDetails = lazy(() => import('./ProductDetails'));
const ProductReviews = lazy(() => import('./ProductReviews'));
const RelatedProducts = lazy(() => import('./RelatedProducts'));
function ProductPage() {
return (
<div>
<Suspense fallback={<p>Loading product details...</p>}>
<ProductDetails />
</Suspense>
<div style={{ marginTop: '20px' }}>
<Suspense fallback={<p>Loading product reviews...</p>}>
<ProductReviews />
</Suspense>
</div>
<div style={{ marginTop: '20px' }}>
<Suspense fallback={<p>Loading related products...</p>}>
<RelatedProducts />
</Suspense>
</div>
</div>
);
}
export default ProductPage;
ãã®äŸã§ã¯ã補åããŒãžã®åã»ã¯ã·ã§ã³ (補åã®è©³çްãã¬ãã¥ãŒãé¢é£è£œå) ãç¬èªã® Suspense å¢çã§ã©ãããããŠããŸããããã«ãããåã»ã¯ã·ã§ã³ãåå¥ã«ããŒãã§ããããå¿çæ§ã®é«ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸã§ããŸãããŸããåã»ã¯ã·ã§ã³ã®ãã©ãŒã«ããã¯ãšããŠã«ã¹ã¿ã ã¹ã±ã«ãã³ã³ã³ããŒãã³ãã䜿çšããŠãããèŠèŠçã«é åçãªããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒãæäŸããããšãæ€èšããŠãã ããã
ãã¹ããã©ã¯ãã£ã¹ãšèæ ®äºé
React Suspense ãšãã¹ããããããŒãã£ã³ã°ç®¡çã䜿çšããå Žåã¯ã次ã®ãã¹ããã©ã¯ãã£ã¹ã念é ã«çœ®ãããšãéèŠã§ãã
- Suspense å¢çãå°ããä¿ã€ïŒ Suspense å¢çãå°ããããããšã§ããããã现ããããŒãã£ã³ã°å¶åŸ¡ãšããåªãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãå¯èœã«ãªããŸããã¢ããªã±ãŒã·ã§ã³ã®å€§ããªã»ã¯ã·ã§ã³ãåäžã® Suspense å¢çã§ã©ããããããšã¯é¿ããŠãã ããã
- ã«ã¹ã¿ã ãã©ãŒã«ããã¯ã³ã³ããŒãã³ãã䜿çšããïŒ åçŽãªããã¹ãã¡ãã»ãŒãžããã¹ã±ã«ãã³ãã¹ãããŒããŸãã¯ããã°ã¬ã¹ããŒãªã©ã®èŠèŠçã«é åçã§æ å ±éã®å€ãããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒã«çœ®ãæããŸãã
- ãšã©ãŒãé©åã«åŠçããïŒ ãšã©ãŒå¢çã䜿çšããŠãããŒãã£ã³ã°ããã»ã¹äžã«çºçãããšã©ãŒããã£ãããããŠãŒã¶ãŒãã¬ã³ããªãŒãªãšã©ãŒã¡ãã»ãŒãžã衚瀺ããŸãã
- ããŒã¿ãã§ããã³ã°ãæé©åããïŒ
swrãreact-queryãªã©ã®ããŒã¿ãã§ããã³ã°ã©ã€ãã©ãªã䜿çšããŠãããŒã¿ãã§ããã³ã°ãšãã£ãã·ã¥ãç°¡çŽ åããŸãã - ããã©ãŒãã³ã¹ãèæ ®ããïŒ Suspense ã³ã³ããŒãã³ãã®éå°ãªãã¹ãã¯ãããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããããé¿ããŠãã ããã debouncing ãš throttling ã䜿çšããŠãã³ã³ããŒãã³ããããŒã¿ãããŒãããããšããåæ°ãå¶éããŸãã
- ããŒãã£ã³ã°ç¶æ ããã¹ãããïŒ ããŸããŸãªãããã¯ãŒã¯æ¡ä»¶äžã§ãããŒãã£ã³ã°ç¶æ ãåªãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããŠããããšã確èªããããã«ãããŒãã£ã³ã°ç¶æ ã培åºçã«ãã¹ãããŸãã
çµè«
React Suspense ã¯ãã¢ããªã±ãŒã·ã§ã³ã§ããŒãã£ã³ã°ç¶æ ãåŠçããããã®åŒ·åã§å®£èšçãªæ¹æ³ãæäŸããŸãããã¹ãããã Suspense ãªã©ã䜿çšããŠãããŒãã£ã³ã°ç¶æ ã广çã«æ§æããæ¹æ³ãçè§£ããããšã§ãããé åçã§å¿çæ§ã®é«ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãäœæã§ããŸãããã®èšäºã§æŠèª¬ãããŠãããã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ãReact Suspense ããã¹ã¿ãŒããéåæäŸåé¢ä¿ãé©åã«åŠçããå ç¢ã§é«æ§èœãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸãã
ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåªå ããæ å ±éã®å€ãããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒãæäŸãããšã©ãŒãé©åã«åŠçããããšãå¿ããªãã§ãã ãããæ éãªèšç»ãšå®è£ ã«ãããReact Suspense ã¯ããã³ããšã³ãéçºã®ããŒã«ãããã§è²ŽéãªããŒã«ã«ãªãå¯èœæ§ããããŸãã
ãããã®ãã¯ããã¯ãæ¡çšããããšã§ãå Žæããããã¯ãŒã¯æ¡ä»¶ã«é¢ä¿ãªããäžçäžã®ãŠãŒã¶ãŒã«ã¹ã ãŒãºã§æ¥œãããšã¯ã¹ããªãšã³ã¹ãã¢ããªã±ãŒã·ã§ã³ã§ç¢ºå®ã«æäŸã§ããŸãã